package com.foundryx.shared.response;

import lombok.Getter;
import lombok.Setter;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @className: PageResult
 * @author: ocxz1
 * @date: 2025/6/25 上午10:59
 * @Version: 1.0
 * @description: fx-share-resources
 */
@Setter
@Getter
public class PageInfo<T> {

    /**
     * 数据列表
     */
    private List<T> dataList;

    /**
     * 总数
     */
    private long total;

    /**
     * 分页信息
     */
    private int pageNum;

    /**
     * 分页信息
     */
    private int pageSize;

    /**
     * 总页数
     */
    private int totalPages;

    /**
     * 是否存在下一页
     */
    private boolean hasNext;

    /**
     * 创建分页结果
     *
     * @param list     数据列表
     * @param total    总数
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @param <T>      数据类型
     * @return 分页结果
     */
    public static <T> PageInfo<T> page(List<T> list, long total, int pageNum, int pageSize) {
        PageInfo<T> pageInfo = new PageInfo<>();
        pageInfo.setDataList(list);
        pageInfo.setTotal(total);
        pageInfo.setPageNum(pageNum);
        pageInfo.setPageSize(pageSize);
        pageInfo.setTotalPages((int) Math.ceil((double) total / pageSize));
        pageInfo.setHasNext(pageInfo.getTotalPages() > pageNum);
        return pageInfo;
    }

    /**
     * 分页（默认分页大小）
     *
     * @param list  列表
     * @param total 总数
     * @param <T>
     * @return
     */
    public static <T> PageInfo<T> page(List<T> list, long total) {
        return page(list, total, 1, 10);
    }

    /**
     * 分页结果转换
     *
     * @param page      原分页结果
     * @param converter 转换器
     * @param <T>
     * @param <V>
     * @return
     */
    public static <T, V> PageInfo<V> convertPage(PageInfo<T> page, Function<T, V> converter) {
        return PageInfo.page(page.getDataList().stream().map(converter)
                .collect(Collectors.toList()), page.getTotal(), page.getPageNum(), page.getPageSize());
    }

    /**
     * 获取一个空的分页结果
     *
     * @param <T>
     * @return
     */
    public static <T> PageInfo<T> empty() {
        return page(Collections.emptyList(), 0, 1, 10);
    }
}
